/**
 * This file is part of 1genia trampoline
 * Copyright (C) 2007-2008 1genia (contact@1genia.com)
 *
 * This library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; version 3 of the License. 
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details. 
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; see the file COPYING.TXT.  If not,
 * write to the Free Software Foundation, Inc., 51 Franklin Street,
 * Fifth Floor, Boston, MA 02110-1301, USA. 
 **/
package com.genia.toolbox.security.ws.client;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;

import org.apache.ws.security.WSPasswordCallback;
import org.springframework.security.Authentication;
import org.springframework.security.context.SecurityContextHolder;

/**
 * a callback to set an user password from the spring security context.
 */
class SpringSecurityPasswordCallback
    implements CallbackHandler
{

  /**
   * the callback itself. It searched for a {@link WSPasswordCallback} and set
   * the password.
   * 
   * @param callbacks
   *          an array of Callback objects provided by an underlying security
   *          service which contains the information requested to be retrieved
   *          or displayed
   * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])
   */
  public void handle(Callback[] callbacks)
  {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication == null) {
      return;
    }
    for (Callback callback : callbacks) {
      if (callback instanceof WSPasswordCallback) {

        WSPasswordCallback passwordCallback = (WSPasswordCallback) callback;
        passwordCallback.setPassword(authentication.getCredentials().toString());
      }
    }
  }
}
